home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
fsw
/
gcc2
/
gcc2.doc
< prev
next >
Wrap
Text File
|
1995-04-22
|
40KB
|
1,021 lines
GCC Charlie 版 簡易ドキュメント
以下、Charlie によるX68k版 gcc をCharlie 版、
真里子さんによるX68k版をまりこ版、FSFによる gcc を
FSF 版と呼ぶことにします。
このドキュメントは FSF 版(Version 2.6.3)に付属の英文ドキュメントをもとに、
Charlie 版が対応している(と思われる)部分を重点に記述したものです。
ただしCharlie 版と他の gcc では動作が異なる機能もあると思いますので、
この点に十分留意してください。
以下、章番号は FSF 版英文ドキュメントと対応しているはずです。
3.2 ファイルの種類/出力を制御するオプション
コンパイラ・ドライバ gcc2 は拡張子でファイルの種類を区別します。
以下に掲げるもの以外は全てリンカの入力ファイルとみなされます。
<プリプロセッサで処理されるファイル>
.c Cのソースファイル。
.m ObjectiveCのソースファイル。
.cc
.cxx
.C 以上3つ、C++のソースファイル。
注)拡張子の指定は大文字・小文字を区別します(デフォルト)から
注意してください。ただしこれを抑止することもできます。
詳しくは 2nd ドキュメントを参照して下さい。
.S アセンブラの入力ファイル。
<プリプロセッサで処理されないファイル>
.i Cのソースファイル。
.ii C++のソースファイル。
.s アセンブラの入力ファイル。
オプション「-x」でファイルの種類を特定することもできます。
-x ファイルの種類
明示的にファイルの種類を特定します。拡張子にかかわらず、
指定された種類のファイルとみなします。有効範囲はコマンドライン上で
次の「-x」オプションまでの間に記述されたファイル名です。
<プリプロセッサで処理されるファイル>
c Cのソースファイル。
objective-c ObjectiveCのソースファイル。
c++ C++のソースファイル。
assembler-with-cpp アセンブラの入力ファイル。
<プリプロセッサで処理されないファイル>
cpp-output Cのソースファイル。
objective-c-cpp-output ObjectiveCのソースファイル。
c++-cpp-output C++のソースファイル。
assembler アセンブラの入力ファイル。
-x none ファイルの種類を拡張子で選択する状態に戻ります。
-x はコンパイルのどの段階から処理を開始するのかを指定します。これに対し、
次に説明するオプション群は処理をどの段階で終了するのかを指定します。
-c リンク処理を行いません。アセンブラの出力を拡張子.o のファイルに記録します。
-S アセンブル・リンク処理を行いません。コンパイラ本体 g2cc1 の出力を
拡張子.s のファイルに記録します。
-E プリプロセッサ g2cpp だけ処理をします。一般に処理結果は標準出力に出力します。
-o ファイル名
出力ファイル名を指定します。複数の指定はできませんので、
複数の入力ファイルに対して-c/S/E を指定している時には有効ではないでしょう。
-o が指定されていない時の出力ファイルの拡張子は
実行形式:デフォルトでは .x,リンカのスイッチ-a で拡張子なし。
アセンブラ出力:.o
g2cc1 出力:.s
g2cpp 出力:標準出力
となります。
-v 各処理段階でのプログラム呼び出しを標準エラー出力に出力します。
また、コンパイラ・ドライバ/g2cpp/g2cc1 のバージョンを表示します。
3.4 gccの拡張機能を制御するオプション
-ansi ANSI 準拠の動作をします。
トライグラフが認識されるようになり、識別子に「$」を用いることはできなくなります。
システムを識別するためにコンパイラが定義するマクロ unix, vax も定義されなく
なります(X68kではもともと定義されませんが)。
gcc 拡張機能のキーワード asm, inline, typeof も予約語でなくなります。
ただし、__unix__, __vax__, __asm__, __inline__, __typeof__, __extension__ は
キーワードとして認識されます。
通常はビルトイン関数として処理される alloca, abort, exit, _exit は
普通の関数として処理されます。
-ansi を指定すると、マクロ __STRICT_ANSI__ が定義されます。
-fno-asm -ansi の機能のうち、gcc 拡張機能のキーワード asm, inline, typeof を予約語
から外す機能だけを働かせます。__unix__, __vax__, __asm__, __inline__, __typeof__ は
キーワードとして認識されます。
-fno-builtin
abort, abs, alloca, cos, exit, fabs, ffs, labs, memcmp, memcpy,
sin, sqrt, strcmp, strcpy, strlen を gcc のビルトイン関数ではなく、
普通の関数として処理します。ただし、これらの関数名の前に「__」を付加したものは
ビルトイン関数として認識されます。
-trigraphs
悪名高き ANSI のトライグラフ処理を行います。-ansi は -trigraphs の機能を含みます。
-traditional
以下に示すような「伝統的な」仕様のコンパイラとして動作します。
・extern 宣言はたとえ関数内部にあってもファイル全体に影響します。
・typeof, inline, signed, const, volatile を予約語とみなしません。
__typeof__ などは予約語とみなします。
・ポインタは int 型と比較できるものとします。
・unsigned short, unsigned char は unsigned int として処理されます。
・ビットフィールドは unsigned として処理されます。
・表現範囲を越えた実数表現もエラーにしません。
・ANSI では「0xe-0xd」という表現は無効な数値表現とみなされてしまいます。
これを 0xe -0xd として処理します。
(ANSI でも 0xe -0xd のようにトークンの区切りを明確にすれば大丈夫です)
・ANSI では文字列定数を初期値に持つ変数は内容を変更できないものとして処理します。
これを、それぞれの変数に領域を割り当てて内容を変更できるようにします。
-fwritable-strings はこの機能だけを働かせます。
・ANSI では setjmp を使用している関数内の volatile 宣言をしていない
auto 変数は内容を保証されません。
-traditional では register 宣言されていない auto 変数は値を保証されます。
*プリプロセッサ g2cpp は通常注釈を空文字(スペースコード)に変換しますが、
なにも出力しないようにします。
*マクロ定義中の文字列にマクロの引数と同様の部分があればこれを置換します。
ANSI では「'」「"」で囲まれた内部は置換の対象になりません。
・マクロ__STDC__ を定義しません。ただし、__GNUC__ は定義されます。
・改行を文字列の終端とみなします。
ANSI では文字列内の改行コードとみなします。
*ANSI のエスケープ・シーケンス「\a」(ベル)「\x」(16進コード)を
ただの文字「a」「x」と認識します。
・C++ で this への代入が可能になります。
-fthis-is-variable はこの機能だけを働かせます。
-ftraditional-cpp
-traditional の機能のうち、*だけを働かせます。
-fcond-mismatch
a ? b : c の b,c の型が異なり、かつ型変換できないような場合、
値0として処理します。(通常はエラーになります。)
-funsigned-char
char 型を unsigned har 型とみなします。マクロ__CHAR_UNSIGNED__ が定義されます。
-fno-signed-char は同じ機能です。
-fsigned-char
char 型を signed har 型とみなします。マクロ__CHAR_UNSIGNED__ は未定義になります。
-fno-unsigned-char は同じ機能です。
Charlie 版のデフォルトの状態です。
-fsigned-bitfields
-fno-unsigned-bitfields
-funsigned-bitfields
-fno-signed-bitfields
ビットフィールドを signed int として(上2つ)、あるいは
unsigned int として(下2つ)処理します。
デフォルトでは int 型と同様、signed です。
ただし、-traditional では unsigned で処理されます。
-fwritable-strings
ANSI では文字列定数を初期値に持つ変数は内容を変更できないものとして処理します。
これを、それぞれの変数に領域を割り当てて内容を変更できるようにします。
-traditional はこの機能を含みます。
-fallow-single-precision
単精度実数値を倍精度に変換してから演算することを禁止します。
-traditional と併用して使用します。
3.5 C++のオプション
-fall-virtual
コンストラクタ関数、new, delete 演算子を除く全てのメンバ関数を
仮想関数として処理します。仮想関数は、動的結合の必要性がある場合に限り
動的結合のコードを出力し、静的に結合できるものは単純な関数呼び出しに
なります。
-fconserve-space
初期値のない、あるいは実行時に初期化される広域変数をCと同様に
common 領域に確保します。デフォルトでは data 領域に確保します。
-fdollars-in-identifiers
「$」を含む識別子を許可します。また、-fno-dollars-in-identifiers を
指定することで、明示的に「$」を含む識別子を禁止します。G++の
デフォルトは機種依存です。伝統的なCコンパイラでは「$」を許可して
いますが、ANSI C/C++ では禁止されています。
-felide-constructors
コンストラクタ処理の無駄を省きます。次のソースを見てください。
A foo ();
A y = foo ();
ANSI C++ 案の通り、正直に解釈すれば
(1)クラス A のコンストラクタで y を初期化する。
(2)関数 foo の結果をテンポラリにとっておく。
(3)テンポラリを y に代入する。
となりますが、オプションを指定すると foo の結果を直接 y に代入します。
コンストラクタの呼びだしが省略されることがあるのですから、コンストラクタに
副作用があった場合、動作が変わってしまう点に注意しましょう。
-fenum-int-equiv
int 型を暗黙のうちに enum 型に変換することを許可します。デフォルトでは
enum 型から int 型への暗黙の変換は許可されていますが、逆はワーニングになります。
-fexternal-templates
テンプレートのインスタンスを #pragma interface と #pragma implementation に
従って作成する。すなわちテンプレートの定義の記述位置が #pragma interface の
有効範囲ならば実体は生成されない。
-falt-external-templates
テンプレートのインスタンスを #pragma interface と #pragma implementation に
従って作成するが、一番初めに登場した定義の記述位置のみをチェックする。
-fno-implicit-templates
明示的な定義なしにテンプレートを使用した場合をエラーにする。
-fhandle-signatures
signature と sigof を予約語として認識する。
-fhuge-objects
デフォルトの short int でカウントできないほど多量の仮想関数を使用することを
宣言する。このスイッチを指定して出力したオブジェクトと指定しないで出力した
オブジェクトをリンクしてはいけない(ライブラリも同様)。また -fvtable-thunks
を指定した時には効力を持たない。
-fno-implement-inlines
#pragma implementation の有効範囲に記述された inline 関数を全てインライン
展開し、サブルーチンとしての実体を出力しません。
-fmemoize-lookups
-fsave-memoized
コンパイル時間短縮のためにキャッシュを使います。特定の条件にあったソースで
なければコンパイルによけい時間がかかってしまいます。
メンバ関数の呼びだし(あるいはデータメンバの参照)は
(1)クラスが、呼び出された名前のメンバ関数を持っているかを決定し、
(2)どのメンバ関数を呼び出すかを決め、必要なら型変換も行い、
(3)呼びだし側が、メンバ関数へのアクセス権を持っているかを調べる
という手順を踏みます。同じメンバを次にアクセスする時にも同じ手順を踏むのは
次のような場合もったいないです。
cout << "This " << p << " has " << n << " legs."n";
キャッシュを設ければこのコストを減らすことができますが、同じメンバへの
アクセスが頻繁に起こらないソースではキャッシュに登録するためのオーバーヘッド
のせいで、よけい遅くなってしまいます。「-fmemoize-lookups」はキャッシュを
作動させるオプションです。
関数ごとに、メンバへのアクセス権は異なるので、キャッシュは一関数を
コンパイルするごとに初期化されます。「-fsave-memoized」を指定すると、
一つのクラスの中のメンバ関数のコンパイル中など、アクセス権が変わらない
間はキャッシュを初期化しなくなります(フレンド関数はアクセス権が異なるので
フレンド関数をコンパイルするとキャッシュは初期化されます)。
-fno-strict-prototype
「int foo ();」のような、引数宣言のない関数宣言を「int foo (void);」と
みなして処理します。
-fnonnull-objects
null リファレンスのチェックをやめます。
obj &a = g();
a.f(2);
デフォルトでは関数 g の戻り値が null だった場合、メンバ関数 f の
呼び出しをスキップするようなコードを出力しますが、多くのプログラムでは
このような処理は必要ないでしょう。
-fthis-is-variable
this への代入を許可します。デフォルトでは const なポインタになっています。
互換性を必要とする場合に使用してください。
-fvtable-thunks
サンクで仮想関数をディスパッチします。
-nostdinc++
C++のヘッダファイルディレクトリを検索しません。
-traditional
C++では、Cでの-traditional の機能に加え、「-fthis-is-variable」の
機能も持っています。
-fno-default-inline
クラス宣言中で定義された関数の inline 展開を行いません。
-Wenum-clash
異なった enum 型への変換に警告をします。
-Woverloaded-virtual
導出クラス(派生クラス)の仮想関数の宣言がベースクラスの型と異なる場合に
警告します。
-Wtemplate-debugging
テンプレートに関する警告を出力します。
+e0
+e1
クラス宣言中の仮想関数定義の扱いを変更します。主に互換性のために用いてください。
+e0 では仮想関数は extern 扱いになります。すなわちクラス宣言中で仮想関数の実体を
定義していても無視されて、単なる宣言として処理されます。
+e1 では実体を定義している場合コンパイルが行われます。
3.6 ワーニング関係のオプション
それぞれのオプションには、例えば -Wimplicit に対して-Wno-implicit のように
反対の動作をするオプションがあります。
ここでは、デフォルトではない方のみを示しています。
また、最適化の過程で得られる変数のフロー解析をもとにしているために、-O を指定しない時は
ワーニングを出さないものもあります(「-O 必要」というのがそうです)。
-fsyntax-only
文法チェックのみを行います。実際のコンパイルは行われません。
-w ワーニング出力をいっさい行いません。
-Wno-import
#import に対してワーニングを出しません。
-pedantic ANSI 準拠のコンパイラとして動作します。-ansi よりもチェックが厳しく、
明示的に型を宣言しない関数がエラーになったりします。
ただし、__unix__, __vax__, __asm__, __inline__, __typeof__ がキーワードとして
認識されることに変わりはありません。
-pedantic-errors
-pedantic でワーニングとなるものも全てエラーにします。
-W 以下の場合をワーニングとします。
・longjmp を使用する際に最適化によって、非 volatile な auto 変数が
レジスタに割り当てられて値が保証できなくなる場合。
ただし、コンパイラは setjmp の呼出しだけをチェックしているので、
シグナルハンドラのように、longjmp が実際には使われない場合でも
ワーニングになります。
・戻り値がある return 文と、値のない return 文が一つの関数の中にある場合。
・副作用を持たない表現があった場合。
・unsigned の値で >= 0 あるいは < 0 という比較を行った場合。
・x <= y <= z などという比較を行った場合。gcc では ( x <= y ? 1 : 0 ) <= z
の意味になり、数学的な比較を想定していると、誤動作の原因となります。
・型宣言などで static などの記憶クラスが int などよりも前(先頭)にない場合。
・struct のように構造を持った型の初期値が正しく括弧で括られていない場合。
struct capacity { int hd,ram ; };
struct x68k { struct capacity size ; char *name ; };
struct x68k cz612c = { 40, 2, "X68000 EXPERT HD" };
のような例では cz612c.size の初期値が括弧で括られていないので
ワーニングになります。
-Wimplicit
戻り値の型を明示的に宣言しない場合、ワーニングにします。
-Wreturn-type
関数の戻り値がデフォルトの int 型以外に宣言された場合と、
void と明示宣言していない関数に戻り値のない return 文がある場合。
-Wunused
局所的に定義された値が参照されていない場合。
static と宣言された関数の実体がファイル中で定義されなかった場合。
結果を用いられない演算がある場合。
関数外で static と宣言され、asm などでしか用いられない変数は、
次のようにすればこのワーニングを回避できます(メモリを消費します)。
#define USE(var) \
static void * use_##var = (&use_##var, (void *) &var)
static 変数定義;
USE (変数名);
-Wswitch
switch 文で enum 型を使用している時、全てのメンバに対応する case が
記述されていない場合(default があればワーニングになりません)。
また、enum 型を使用している時、メンバにない値の case がある場合。
-Wcomment
注釈の中に「/*」(注釈の開始)がある場合。
-Wtrigraphs
トライグラフ処理を行った時にメッセージを表示します。
-trigraphs, -ansi を同時に指定した時に有効です。
-Wformat
printf, scanf などの書式指定と引数が一致していない場合。
-Wchar-subscripts
配列の添字が char 型の場合。char 型が signed であることが
しばしば問題になるため、このオプションが存在します。
-Wuninitialized (-O 必要)
auto 変数を初期化しないで用いた場合。
レジスタ割り当ての変数しか対象としないので、volatile 宣言された変数、
アドレスを必要とする変数、レジスタに収まらない大きさの変数はワーニングを
受けません。また、初期化しないで値を用いても、その演算結果が最適化によって
必要なくなれば、ワーニングを受けません。
このワーニングがオプションなのは、コンパイラが初期化されないとみなす変数が
実際には初期化されていることがあるからです。例を示しましょう。
{
int x;
switch (y)
{
case 1 : x=1 ; break ;
case 2 : x=4 ; break ;
case 3 : x=6 ; break ;
}
foo(x);
}
y の値が1、2、3の範囲にあるようなプログラムだったとしても
コンパイラはそのことを知りませんから、初期化されない場合があるとみなします。
{
int save_y ;
if ( change_y ) save_y = y, y = new_y ;
...
if ( change_y ) y = save_y ;
}
save_y がこの他の場所で用いられなければ問題はありませんが、コンパイラは
ワーニングを発します。
また、制御を戻さない関数を volatile 宣言していない場合にも同様にワーニングが
発生します。
-Wparentheses
優先順位の紛らわしい演算子を括弧なしで用いている場合など。
-Wenum-clash
C++ 専用。enum 型を異なる enum 型に変換している場合。
-Wtemplate-debugging
C++ 専用。テンプレートを用いたために、デバッグのための情報が
正しく生成できない場合。
-Wreorder
ソース記述と異なる順番でメンバの初期化が行われる場合。
struct A
{
int i;
int j;
a(): j (0), i (1) {}
};
のようなソースでは i を先に初期化するコードとなり警告が発せられます。
-Wall 以上の全てのワーニング処理(-W で始まらないものを除く)を行います。
以下のワーニング・オプションは-Wall では機能しません。
必要に応じて個々に設定してください。
-Wtraditional
「伝統的な」Cと ANSI C では解釈が異なる場合。
・マクロの引数がマクロ定義の文字列内に現れる場合。
・局所的に extern 参照宣言した関数を別のブロック内で参照している場合。
・long 型の値をとる switch 文。
-Wshadow 局所定義が、より広域な局所定義を覆ってしまう場合。
-Wid-clash-長さ
指定した文字数まで一致する識別子がある場合。指定の文字数までしか
チェックしないのでワーニングの表示は「何文字一致しているか」を
表示しているのではありません。またワーニングが出るだけで、
別々の識別子として正しく認識されています。
長さ0を指定すると1を指定したのと同じになります。
昔のまりこ版ではデバッグ情報を付加する-g, -scd オプションが指定された時に
-Wid-clash-7 が指定されるという仕様があったようですが、最近のバージョンでは
外されたようなので、Charlie 版でもこの処理は行っていません。
-Wlarger-than-長さ
指定したバイト数を越えるオブジェクトを定義した場合。
-Wpointer-arith
関数や void の sizeof を用いた場合。gcc ではこれらは1と定義されています。
-Wbad-function-cast
関数の戻り値を明示的に型変換した場合。
-Wcast-qual
ポインタの型変換で、const から non const に変換したなど。
-Wcast-align
ポインタの型変換で、char * を int * に変換したなど。MC68030 では
問題になりませんが、MC68000 ではエラーの原因になります。
-Wwrite-strings
文字列定数で初期化した配列に値を代入しようとした場合。
-Wconversion
プロトタイプと異なる型を使用している場合。
負数を暗黙のうちに unsigned 型に変換する場合。
-Waggregate-return
struct などの構造を持った型を関数の戻り値に用いている場合。
-Wstrict-prototypes
引数の型を特定できない関数の宣言、定義がある場合。
-Wmissing-prototypes
広域関数がプロトタイプなしに定義されている場合。
定義自体に型の定義が含まれていても、他のファイルからは参照できないので
ワーニングになります。ヘッダ・ファイルで宣言を行ってください。
-Wmissing-declarations
広域関数が宣言なしに定義されている場合。
ヘッダファイルで宣言し忘れた関数の有無をチェックするために使用して下さい。
-Wredundant-decls
一つのスコープの中に同じ識別子の宣言が複数存在する場合。
-Wnested-externs
関数の内部で extern 参照宣言をしている場合。
-Winline inline 指定あるいは-finline-functions によって inline 展開を指示された関数が
展開できなかった場合。
-Woverloaded-virtual
C++専用。virtual 関数と同名の関数定義で、ベース・クラスと型の異なる場合。
-Wsynth
G++特有の演算子の解釈を警告します。
struct A {
operator int ();
A& operator = (int);
};
main ()
{
A a,b;
a = b;
}
a = b の演算子について、G++ では自動的に A& =(const struct A&) と
解釈しますが、他の処理系では =(int) と解釈するでしょう。このような
場合を警告します。
-Werror ワーニングを全てエラーとして処理します。
3.7 デバッグ用のオプション
-g それぞれのシステム用の gdb が必要とするデバッグのための情報を生成します。
X68k では SHARP/Hudson の SCD フォーマットです。
-gレベル デバッグ情報の詳細度を指定します。デフォルトは2です。
レベル1では局所変数やソース行との対応情報が省略されます。
レベル3ではマクロ展開などの情報が付加されます。
-p プログラムの実行状況を解析できるようにプロファイル情報を付加します。
-pg gprof 用のプロファイル情報を生成します。
-a gprof 用のプロファイル情報を生成します。
-d機能 各種のコンパイル情報を生成します。
まりこ版では生成ファイル名は、入力ファイルの拡張子以下を変更したものでしたが、
Charlie 版では入力ファイル名にそのまま付加します(例:foo.c -> foo.c.rtl)。
とぅぇにぃわんが作動している環境を前提にしていますので、そうでない場合は
使用しない方が賢明でしょう。
また、標準入力からのソースに対しては gccdump.*** と言うファイルを生成します。
-dM マクロ定義だけを集めて出力します。g2cpp で処理を停止します。
-dN マクロの識別子だけを集めて出力します。他の処理も継続して行われます。
-dD マクロ定義だけを集めて出力します。他の処理も継続して行われます。
-dy 標準エラー出力にパース(字句解析)情報を出力します。
現在Charlie 版では機能を省略してあります。
-dr RTL(gcc の内部コード)を.rtl に出力します。
-dx -dr と同時に指定して、コンパイルを RTL 生成で終了させます。
-dj ジャンプ命令の最適化の後で RTL を.jump に出力します。
-ds CSE(共通部分式)最適化後、2度目のジャンプ最適化の後で RTL を.cse に出力します。
-dL ループ最適化の後で RTL を.loop に出力します。
-dt 2度目の CSE 最適化&3度目のジャンプ最適化の後で RTL を.cse2 に出力します。
-df フォロー解析・最適化の後で RTL を.flow に出力します。
-dc 複数命令間の最適化の後で RTL を.combine に出力します。
-dS 命令の発行順序の最適化の後で RTL を.sched に出力します。mc68k ではサポートされて
いません。ファイルは生成されますが、情報は出力されません。
-dl 局所値をレジスタに割り当てた後で RTL を.lreg に出力します。
-dg 全仮想レジスタをメモリ・レジスタに割り当てた後で RTL を.greg に出力します。
-dR 2度目の命令の発行順序の最適化の後で RTL を.sched2 に出力します。
-dJ 最後のジャンプ最適化の後で RTL を.jump2 に出力します。
-dd 遅延ブランチのある MPU ではこれを活用した最適化の後で RTL を.dbr に出力します。
mc68k ではサポートされていません。ファイルは生成されますが、情報は出力されません。
-dk スタックフレームを割り当てた後で RTL を.stack に出力します。
-da -dr から-dk を全て指定したのと同様の処理を行います。
-dm 標準エラー出力にコンパイラのメモリ使用状況を出力します。
-dp アセンブラに渡すファイルに、最終的に適合した命令のパターン、オペランドの型を
注釈として付加します。
-fpretend-float
クロス・コンパイルの時に、ホスト・システムの浮動小数フォーマットを用います。
Charlie 版では無効です。
-save-temps
中間ファイルを全て残します。.c から実行形式ファイルを生成する場合、
プリプロセッサ出力の.i、cc1 出力の.s、アセンブラ出力の.o を消去しません。
-print-file-name=ライブラリ名
指定したライブラリのフルパスを表示して処理を終了します。
-print-file-name=
指定したプログラム名のフルパスを表示して処理を終了します。指定できるのは
g2cpp.x, g2cc1*.x などです。
-print-libgcc-file-name
libgcc.a のフルパスを表示して処理を終了します。
3.8 最適化制御のオプション
最適化は一般に実行形式ファイルのサイズ縮小と実行速度向上をもたらします。
-O0 最適化を行いません。gcc は多くの処理過程を省略します。その結果、
明示的に register されていない変数は全くレジスタ割り当てされません。
-O
-O1 最適化を行います。
-O2 -O(1)よりも多くの最適化処理を行います。
-O3 -O2 に加え、-finline-functions を指定したのと同様です。
最適化のオプションは最後に指定したものが有効です。
以下に示す-f で始まるオプションはシステムごとに用意された最適化オプションです。
それぞれのオプションには、例えば-finline に対して-fno-inline のように
反対の動作をするオプションがあります。
ここでは、デフォルトではない方のみを示しています。
各オプションの後の()は、○なら最適化を促進する意味、×なら最適化をしないことを
表しています。
-ffloat-store (×)
浮動小数値をレジスタに一時保存しないようにします。
68881 のレジスタは IEEE の定める倍精度以上の精度を持っています。
一般にこれは長所と考えられますが、IEEE の精度に依存したいくつかの
プログラムでは問題になります。
-fno-default-inline (×)
C++ 専用。クラス内部で定義されたメンバ関数を自動的に inline 展開しません。
デフォルトではそのような関数は最適化によって inline 展開されます。
-fno-defer-pop (×)
関数呼出しの度にスタックポインタを再計算します。
-fforce-mem (○)
メモリを参照する時、値をレジスタに取り込んで、次に同じ値が必要な時に備えます。
何度も同じ値を参照する場合などに有効でしょう。
-fforce-addr (○)
アドレス計算で必要な値をレジスタに用意し、次に同じ値が必要な時に備えます。
-fomit-frame-pointer (○)
必要がなければフレーム・ポインタを生成しないようにします。
vax などではフレーム・ポインタが自動的に生成される(らしい)ので、
このスイッチの効果はありません。このようなシステムでは FRAME_POINTER_REQUIRED
が1になっています。
-fno-inline (×)
inline 指定の関数も inline 展開しません。
ちなみに、最適化をしない時も inline 展開は行われません。
-finline-functions (○)
指定のない関数でもできる限り inline 展開します。ただし、定義より前に
呼出された箇所では展開されません。
static 指定の関数が inline 展開されてしまうと、サブルーチンとしての
実体は消滅してしまいます。
-fkeep-inline-functions (×)
static 指定の関数が inline 展開されてしまっても、サブルーチンとしての
実体を生成します。
-fno-function-cse (×)
何度も呼出される関数のアドレスをレジスタに用意しておく処理を禁止します。
-ffast-math (○)
ANSI/IEEE の規定にあるエラー処理などを省略して実行速度を向上させます。
例:sqrt の引数が負数でも気にしない
誤作動の原因にもなりますから、使用しない方が無難でしょう。
-fstrength-reduce (○)
反復処理のループ内部での演算や、終了条件チェックを最適化します。
-fthread-jumps (○)
条件判断の飛び先に同じ条件の条件判断があったら2度目以降はチェックしない
ようにする最適化を行います。
-fcse-follow-jumps (○)
共通部分式の検索範囲を広くします。
if/then/else のようにジャンプもとが分かっている分岐で
if の前と else 処理部分で共通部分式を検索します。
-fcse-skip-blocks (○)
共通部分式の検索範囲を広くします。
else のない if/then のように一方だけ別処理をする分岐では
if の前と then 処理部分の後で共通部分式を検索します。
-frerun-cse-after-loop (○)
ループ最適化の後に共通部分式の最適化を再度行います。
-fexpensive-optimizations (○)
その他、時間のかかる割には効果は保証できないマイナーな最適化を行います。
-fdelayed-branch (○)
ブランチ命令がディレイ・スロットを持っている MPU では命令発行順序の
最適化が行われます。mc68k ではサポートされていません。
-fschedule-insns
-fschedule-insns2 (○)
ある種の MPU では命令発行順序の最適化が行われます。
mc68k ではサポートされていません。
-fcaller-saves (○)
関数呼び出しで内容が保証されなくなるレジスタにも変数の値を割り付けることを
許可します。関数呼び出しの前に値をスタックに退避する必要があったりするので、
割り付けることのメリットが大きい場合のみ割り当てられます。
-funroll-loops (○)
ループ・アンローリングを行います。反復回数がコンパイル時に予測できる
ループを展開します。030のことを考えると(000でも人手による場合に比べ)
大した効果は望めないでしょう。
-funroll-all-loops (○?)
全てのループを展開してしまいます。コンパイル時に回数が分からなくても展開して
しまうので効率も悪く、特殊な場合以外は実行速度が遅くなってしまいます。
-fno-peephole (×)
アセンブラ・コードのレベルでの最終的な最適化を禁止します。
3.9 プリプロセッサの制御を行うオプション
以下のオプションの中には、同時に-E を指定する必要があるものもあります。
-include ファイル名
各入力ファイルの先頭に、指定されたファイルをインクルードします。
複数指定された場合はその順番に追加していきます。
-D や-U が先に処理されることに注意してください。これはコマンド
ラインに記述した順番は関係ありません。
-imacros ファイル名
各入力ファイルの処理の前に、指定されたファイル中のマクロ定義を処理します。
複数指定された場合はその順番に追加していきます。-include との優先順位も
記述の順番に依存します。
-D や-U が先に処理されることに注意してください。
これはコマンドラインに記述した順番は関係ありません。
ファイルの内容自体は出力されない点が-include と異なります。
-idirafter ディレクトリ
第2インクルードファイル検索パスに指定のディレクトリを追加します。
デフォルトのインクルードファイル検索パス上に発見できなかった場合に
検索されます。
-nostdinc デフォルトのインクルードファイル検索パスを検索しません。
-I で明示的に指定されたパスと、カレントだけを検索します。
-undef マクロ定義のうち、システムを特定するものを全て未定義にします。
__human68k__ などがこれに当たります。
-E プリプロセッサで処理を終了します。処理結果を「標準出力」あるいは
-o で指定されたファイルに出力します。
-C 注釈を消去しないで出力します。g2cc1 では処理できないので-E と
同時に指定します。
-P 出力ファイルに #line を出力しません。-E と同時に指定します。
-M 入力ファイルのファイル依存ルールを生成、標準出力に出力します。
#include でインクルードされるファイルを依存ファイルとみなします。
書式は make 準拠です。プリプロセッサは本来の出力を行わず処理を終了します。
-MM 入力ファイルのファイル依存ルールを生成、標準出力に出力します。
#include "**"で指定されるファイルを、依存するユーザヘッダとみなします。
#include <**>で指定されるファイルは、システムヘッダとみなし対象にしません。
書式は make 準拠です。プリプロセッサは本来の出力を行わず処理を終了します。
-MD -M の出力を.d にします。複数の入力がある場合に有効です。
-MMD -MM の出力を.d にします。複数の入力がある場合に有効です。
-MG -M または -MM と同時に指定して、存在しないヘッダファイルをソースファイルの
ディレクトリにあるとみなします。
-H 使用されたヘッダファイル名を全て表示します。単独では
他の処理を停止させる機能はありません。
-D マクロ識別子
指定のマクロを値1で定義します。
-D マクロ識別子=値
指定のマクロを指定の値で定義します。
-U マクロ識別子
指定のマクロを未定義にします。コマンドラインでの順番に関係なく
-D の後、-include, -imacros の前に処理されます。
-dM プリプロセッサの処理終了時に有効だったマクロ定義のリストを出力して
処理を終了します。-E と同時に指定します。
-dD マクロ定義リストを出力します。他の処理も継続して行われます。
-dN マクロの識別子を出力します。他の処理も継続して行われます。
-trigraphs
ANSI のタライグラフ処理を行います。-ansi オプションはこの機能を含みます。
3.10 アセンブラの動作を指定するオプション
-Wa,引数 アセンブラのコマンドラインに指定の引数を追加します。
複数の場合`,'で区切って指定します。ですから「,」を内容に
用いることはできません。
3.11 リンカの動作を指定するオプション
-c
-S
-E リンク処理は行われません。
-lライブラリ名
指定のライブラリファイルをリンクします。リンクの順番はコマンドラインに
記述された順番に依存します。
なお、実際にリンカに渡されるファイル名は「libライブラリ名.a」です。
デフォルトの検索パス上にない場合は-L で指定されたパスを検索します。
-lobjc(sx)
Objective Cの実行形式ファイルを生成する場合には必ず指定してください。
-nostdlib システムの標準ライブラリをリンクしません。
Charlie 版では libc.a, libgcc.a が標準ライブラリです。
-Xlinker 引数
リンカのコマンドラインに指定の引数を追加します。
複数の場合順番に-Xlinker を並べます。-Xlinler "引数1 引数2"では
空白を含む一つの文字列として渡されます。-Xlinker 引数1 -Xlinker 引数2
と記述してください。
-Wl,引数 リンカのコマンドラインに指定の引数を追加します。
複数の場合`,'で区切って指定します。ですから「,」を内容に
用いることはできません。
3.12 ファイル検索のパスを指定するオプション
unix 環境から human68k 上へ移植する作業で、ファイル関係の変更は
大きなウェイトを占めています。MS-DOS 上位互換のディレクトリ構造を持つ
human68k では以下のオプションがうまく動作しない可能性もあります。
-Iディレクトリ
インクルードファイルを検索するデフォルトパスに指定のディレクトリを追加します。
-I- ユーザ・ヘッダファイル専用の検索パスを指定可能にします。
このオプションより前に記述された-I は #include "**" による
ユーザ・ヘッダファイルの検索だけに有効です。また、後に記述された-I は
全ての #include に有効になります。-I-がない場合は-I は全て後者として
扱われます。
また、このオプションを指定するとユーザ・ヘッダの検索パスから、
入力ファイルのあるディレクトリを外します(デフォルトでは
最優先検索パスです)。この機能だけを on/off するオプションはありません。
-I. はカレントディレクトリなので厳密には意味が異なりますが、
これで間に合わせることのできるケースが多いでしょう。
-Lディレクトリ
-l オプションでリンクされるライブラリを検索するパスを指定します。
-Vバージョン
コンパイラのバージョンを指定します。実際には環境変数 COMPILER_PATH
で指定したディレクトリにサブディレクトリを作成し、その中にバージョン
ごとに g2cpp.x & g2cc1*.x を格納します。
ex. COMPILER_PATH=a:\gcc2 で-VLv.2 とすると、a:\gcc2\Lv.2 から
実行ファイルを検索します。a:\gcc2 に実行ファイルがあっても
サブディレクトリが優先します。
3.14.1 68000用のオプション
Charlie 版のデフォルトターゲットは mc68000 (without FPU), human68k(SX-Window),
g2as syntax という環境です。68020 以降や数値演算プロセッサを指定した時の
出力・動作についてCharlie は(今のところ)確認することができないので、不具合は
報告してください。
-m68000
-mc68000 68000 用のコードを出力します。全てのまっとうな X68k で動作するコードになります。
-m68020
-mc68020 68020 用のコードを出力します。
-m68881 68881 を前提としたコードを出力します。
-m68030 68030 用のコードを出力します。全てのまっとうな X68030 で動作する
コードになるはずです。
-m68040 68040 用のコードを出力します。
-m68020-40
68020/68030+68881/2, 68040 のいずれの環境でも動作するコードを出力します。
最適化は 040 で最も効率的になるように行われます。
-mshort int を 16 bits として処理します。指定する場合、ライブラリなどとの値受け渡しに
十分注意する必要があります。
-mnobitfield
020 以降のビットフィールド命令を使用しません。-m68000 はこの機能を含みます。
-mbitfield
ビットフィールド命令を使用します。
-mrtd 010 以降の rtd 命令を使用します。unix のシステムコールが rtd を
用いなければ利用できないので、用意してあります。
このオプションを指定する時は全ての関数の引数型が宣言されていなければ
なりません。また、rtd が処理しきれないほどの大量の引数をもつ関数では
正しくないコードを出力してしまいます。
対応表 o:on x:off -:不変
9876543210
m(c)68000 xx-----x-x 0:68020 の命令を使用する。
m(c)68020 xx-----o-o 1:68881 の命令を使用する。
m68030 xx-----o-o 2:ビットフィールド命令を使用する。
m68040 o------ooo 3:rtd を使用する。
4:レジスタで引数を渡す
m68020-40 -o-----ooo 5:int を 16 bits とみなす
6:(SUN fpa の命令を使用する)
m68881 --------o- 7:(SUN sky を使用する)
mbitfield -------o-- 8:68040 の実行クロックで最適化する。
mrtd ------o--- 9:68040 専用の FPU 命令を使用する。
mshort ----o-----
3.15 その他のオプション
-fpcc-struct-return(×)
全ての構造体・共用体の戻り値をメモリ上の領域にとり、ポインタで
扱うようにします。互換性のためのオプションです。
-freg-struct-return(-)
レジスタに収まる数ワードの構造体・共用体の戻り値をレジスタにとります。
Charlie 版、まりこ版ではデフォルトになっています。
「-fpcc-struct-return」とは排他的なオプションです。
-fshort-enums
enum 型は通常 int ですが、最大値が収まる最小バイト数で扱うようにします。
-fshort-double
double を float と同じ大きさにします。
-fno-ident
#ident を無視します。
-fvolatile
ポインタを全て volatile 扱いにします。
-fvolatile-global
extern 変数を volatile 扱いにします。
-ffixed-レジスタ
指定されたレジスタを使用しないコードを生成します。
-fcall-used-レジスタ
呼びだし側の値を保存しなくてもよいレジスタとみなします。
-fcall-saved-レジスタ
呼びだし側の値を保存しなければならないレジスタとみなします。
-------
このドキュメントでは浮動小数点型数値を「実数値」と表記しています。